Session 13 - Creating Maps I

Fabian Gülzau

25 Januar 2018

Programm

  1. Einleitung
  2. Arbeitsbeispiel: John Snow - Cholerakarte
  3. Das Paket: ggmap
  4. Cholera Map mit R
  5. Weitere Funktionen

1. Einleitung

Karten spielen schon seit Beginn eine Rolle im Feld der “Visualisierungen”:

1. Einleitung

Spatial data are everywhere” (Bivand et al. 2008: 1)

-> Geographical Information Systems (GIS)

R und GIS / R als GIS

R und GIS:

Problem: voraussetzungsvoll (GIS, R)

Vorgehen

Ziel: Karten erstellen und zusätzliche Daten mit ggplot2 ergänzen

2. Arbeitsbeispiel: John Snow - Cholera Map

Der Mediziner John Snow konnte 1854 eine Choleraepidemie eindämmen und zeigen, dass die Krankheit nicht, wie angenommen, über die Luft übertragen wird, sondern durch verunreinigtes Wasser.

Tufte (1997: 29-32) hebt positiv hervor, dass Snow:

2. Arbeitsbeispiel: John Snow - Cholerakarte

Quelle: Tufte (1997: 30f.).

3. Das Paket: ggmap

ggmap (Kahle & Wickham 2013) basiert auf dem “Grammar of Graphics”, wie es in ggplot2 implementiert ist.

Die Logik ist folgendermaßen:

  1. Karte herunterladen (get_map())
  2. Karte als Kontextlayer in ggplot2 verwenden (ggmap())
  1. Weitere Layer über ggplot2 ergänzen (etwa geom_point)

Anmerkung: Sogenannte Shapefiles können zudem über über fortify in data.frames transformiert werden.

4. Cholerakarte mit R

Im Folgenden werden wir die o.g. Schritte einsetzen, um die Karte aus (Tufte 1997: 30f.) mit R zu rekonstruieren.

Hierfür benötigen wir:

Pakete:

install.packages("ggmap")

# Falls dies nicht klappt:
install.packages("devtools")
devtools::install_github("dkahle/ggmap")

library(tidyverse)
library(ggmap)
library(cowplot)

Daten (Quelle):

death <- readRDS(file = "C:\\Users\\User\\HU-Box\\Seafile\\Meine Bibliothek\\Seminare\\WS 2017\\Sessions\\Session 13\\Death")
pump <- readRDS(file = "C:\\Users\\User\\HU-Box\\Seafile\\Meine Bibliothek\\Seminare\\WS 2017\\Sessions\\Session 13\\Pump")

4. Cholerakarte mit R: Daten

Die Daten:

glimpse(death)
## Observations: 250
## Variables: 4
## $ count    <int> 3, 2, 1, 1, 4, 2, 2, 2, 3, 2, 2, 1, 3, 1, 4, 1, 1, 1,...
## $ geometry <chr> "<Point><coordinates>-0.13793,51.513418</coordinates>...
## $ lon      <dbl> -0.137930, -0.137883, -0.137853, -0.137812, -0.137767...
## $ lat      <dbl> 51.51342, 51.51336, 51.51332, 51.51326, 51.51320, 51....
glimpse(pump)
## Observations: 8
## Variables: 4
## $ count    <int> -999, -999, -999, -999, -999, -999, -999, -999
## $ geometry <chr> "<Point><coordinates>-0.136668,51.513341</coordinates...
## $ lon      <dbl> -0.136668, -0.139586, -0.139671, -0.131630, -0.133594...
## $ lat      <dbl> 51.51334, 51.51388, 51.51491, 51.51235, 51.51214, 51....

5. Cholerakarte mit R: get_map

ggmap bietet mit get_map mehrere Möglichkeiten Karten herunterzuladen.

get_map() hat u.a. folgende Argumente:

5. Cholerakarte mit R: get_map

Anwendung von get_map:

# Google Map
snow.map.ggl <- get_map(location = "Soho, London",
                    zoom = 16,
                    source = "google",
                    maptype = "terrain")

# Stamen Map
snow.map.stm <- get_map("Soho, London",
                        zoom = 16, 
                        maptype="terrain", 
                        source = "stamen")

5. Cholerakarte mit R: Base Map

Die Karten lassen sich nun mit der Funktion ggmap in einen Layer für ggplot2 überführen:

gg.map.ggl <- ggmap(snow.map.ggl)
gg.map.stm <- ggmap(snow.map.stm)

# Kombinieren und plotten (cowplot)
plots <- list(gg.map.ggl, gg.map.stm) 

library(cowplot)
plot_grid(plotlist = plots, ncol = 2, labels = c("Google Maps", "Stamen Maps"))

Demonstration weiterer Basiskarten (Funktion wird nicht angezeigt):

6. Cholerakarte mit R: Weitere Layer

Nun lassen sich mit den bekannten ggplot2-Funktionen weitere Layer ergänzen. Könnt ihr die Punkte und Pumpen hinzufügen? Hier ist ein Codeschnipsel als Hinweis:

gg.map.stm +          # Basiskarte
  geom_point(...) +   # Layer für Todesfälle
  geom_point(...) +   # Layer für Pumpen
  theme_void() +      # theme_void, um Achsenbeschriftung zu vermeiden
  labs(...)           # Titel, Caption

5. Weitere Funktionen

ggmap enthält zudem weitere hilfreiche Funktionen:

# Query limit = 2,500 (a day)
ISW <- geocode(location = "Universitaetsstr. 3b, Berlin", source = "google")

# The other way aroung
revgeocode(location = c(ISW$lon, ISW$lat), source = "google", output = "address")

5. Weitere Funktionen

Mit Hilfe von ggfortify können shapefiles verwendet werden:

get_map, um eine Karte von Berlin zu erhalten:

berlin <- get_map(location = "Berlin",
                  zoom = 10,
                  maptype = "toner",
                  source = "stamen")

Shapefile vorbereiten und als Layer verwenden:

library(rgdal)

# Shapefiles (Source: https://daten.berlin.de/datensaetze/rbs-bezirke-dezember-2016)
berlin.shp <- readOGR(dsn = "C:/Users/User/HU-Box/Seafile/Meine Bibliothek/Seminare/WS 2017/Sessions/Session 13/RBS-Berlin") %>%
                      spTransform(CRS("+proj=longlat +datum=WGS84"))
## OGR data source with driver: ESRI Shapefile 
## Source: "C:/Users/User/HU-Box/Seafile/Meine Bibliothek/Seminare/WS 2017/Sessions/Session 13/RBS-Berlin", layer: "RBS_OD_BEZ_2016_12"
## with 12 features
## It has 2 fields
# Fortify to plot with ggplot2
berlin.fshp <- fortify(berlin.shp)

# Plot map and overlay with shapefile
ggmap(berlin) +
  geom_polygon(data = berlin.fshp, mapping = aes(x = long, y = lat, group = group),
               color = "blue", fill = "black", alpha = .4)